package com.catazy.module_project.local.dao

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Transaction
import com.catazy.module_project.bean.ArticleData
import com.catazy.module_project.bean.ArticleDetail
import com.catazy.module_project.bean.ArticleDetailWithTag
import kotlinx.coroutines.flow.Flow

/**
 * 作者: Tao
 * 日期: 2024/5/10
 * 时间: 11:00
 * 描述: 文章详情dao
 *      @Transaction 注释，以确保整个操作以原子方式执行
 */
@Dao
interface ArticleDetailDao {

    /**
     * 插入数据
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(vararg data: ArticleDetail)

    /**
     * 只能查询ArticleDetail表
     */
    @Transaction
    @Query("SELECT * FROM ARTICLE_DETAIL")
    fun getArticleDetailList(): Flow<MutableList<ArticleDetail>>

    /**
     * 可将ArticleDetail表和TAG表一起联合查询
     * 该方法需要 Room 运行两次查询，因此应向该方法添加 @Transaction 注释，以确保整个操作以原子方式执行
     */
    @Transaction
    @Query("SELECT * FROM ARTICLE_DETAIL ORDER BY id ASC")
    fun getArticleDetailWithTag(): Flow<MutableList<ArticleDetailWithTag>>

    /**
     * 删除数据 通过id
     * @param articleId 文章id
     */
    @Transaction
    @Query("DELETE FROM ARTICLE_DETAIL WHERE id=:articleId")
    fun deleteArticleById(articleId: String)

    @Delete
    fun deleteArticle(vararg articleDetail: ArticleDetail)

    /**
     * 根据Url更新本地路径
     * @param localPath 本地路径
     * @param url 图片url
     */
    @Transaction
    @Query("UPDATE ARTICLE_DETAIL SET local_path = :localPath WHERE envelope_pic = :url")
    fun updatePathByUrl(localPath: String, url: String)
}